package org.xx.armory.rpc.routing;

import org.xx.armory.objectparser.LineInfo;
import org.xx.armory.objectparser.ParsedObject;

import java.util.ArrayList;
import java.util.Collection;

import static org.xx.armory.commons.Validators.notBlank;

/**
 * 审计模板。
 *
 * @author Haart
 */
public final class AuditTemplate extends ParsedObject {
    private final long category;
    private final long action;
    private final String format;
    private final Collection<String> keywords;

    /**
     * 构造审计模板对象。
     *
     * @param lineInfo
     *         源文件中的位置信息。
     * @param category
     *         执行的操作的类别。
     * @param action
     *         执行操作的ID。
     * @param format
     *         审计明细的的格式。
     * @param keywords
     *         审计的检索关键字。
     * @throws NullPointerException
     *         如果参数{@code format}是{@code null}。
     * @throws IllegalArgumentException
     *         如果参数{@code format}只包含空白字符。
     */
    public AuditTemplate(
            final LineInfo lineInfo,
            final long category,
            final long action,
            final String format,
            final Collection<String> keywords
    ) {
        super(lineInfo);
        this.category = category;
        this.action = action;
        this.format = notBlank(format, "format").trim();
        this.keywords = new ArrayList<>();
        if (keywords != null) {
            this.keywords.addAll(keywords);
        }
    }

    /**
     * 获取执行的操作的类别。
     *
     * @return 执行的操作的类别。
     */
    public final long getCategory() {
        return category;
    }

    /**
     * 获取执行操作的ID。
     *
     * @return 执行操作的ID。
     */
    public final long getAction() {
        return action;
    }

    /**
     * 获取审计明细的的格式。
     *
     * @return 审计明细的的格式。
     */
    public final String getFormat() {
        return format;
    }

    /**
     * 获取审计的检索关键字。
     *
     * @return 审计的检索关键字。
     */
    public final Collection<String> getKeywords() {
        return keywords;
    }
}
